﻿using System;
using System.Data;
//Oracle推荐使用Oracle.ManagedDataAccess.Client，System.Data.OracleClient已过时且麻烦（安装客户端，位数问题等）
//using Oracle.ManagedDataAccess.Client;

namespace Common
{
    /// <summary>
    /// 数据库连接扩展
    /// IDbConnection控制权外放，便于外部灵活控制，使用示例：
    /// using (var con = DbFactory.GetConnection())
    //  {
    //      var dt = con.GetDataTable(sql);
    //  }
    /// </summary>
    public static class ConExtension
    {
        /// <summary>
        /// 执行ExecuteNonQuery（可执行存储过程）
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="type"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public static int ExecuteNoQuery(this IDbConnection con, string sql, CommandType type = CommandType.Text, params IDbDataParameter[] parameters)
        {
            using (IDbCommand cmd = con.CreateCommand())
            {
                cmd.CommandText = sql;
                cmd.CommandType = type;
                //parameters即使外部调用时，不传入参数，默认是个长度为零的数组
                //这里的判断，为了防止可能从别人那里接收的参数为空的情况会报错
                if (parameters != null)
                {
                    foreach (var parameter in parameters)
                    {
                        cmd.Parameters.Add(parameter);
                    }
                }
                con.Open();
                return cmd.ExecuteNonQuery();
            }
        }

        /// <summary>
        /// 执行ExecuteScalar
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public static Object ExecuteScalar(this IDbConnection con, string sql, params IDbDataParameter[] parameters)
        {
            using (IDbCommand cmd = con.CreateCommand())
            {
                cmd.CommandText = sql;
                cmd.CommandType = CommandType.Text;
                //parameters即使外部调用时，不传入参数，默认是个长度为零的数组
                //这里的判断，为了防止可能从别人那里接收的参数为空的情况会报错
                if (parameters != null)
                {
                    foreach (var parameter in parameters)
                    {
                        cmd.Parameters.Add(parameter);
                    }
                }
                con.Open();
                return cmd.ExecuteScalar();
            }
        }

        /// <summary>
        /// 获取查询结果的DataTable
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public static DataTable GetDataTable(this IDbConnection con, string sql, params IDbDataParameter[] parameters)
        {
            DataTable result = null;

            var adapter = DbFactory.GetDataAdapter(sql, con);
            if (adapter is IDisposable disposableAdapter)
            {
                using (disposableAdapter)
                {
                    adapter.SelectCommand.CommandType = CommandType.Text;
                    //parameters即使外部调用时，不传入参数，默认是个长度为零的数组
                    //这里的判断，为了防止可能从别人那里接收的参数为空的情况会报错
                    if (parameters != null)
                    {
                        foreach (var parameter in parameters)
                        {
                            adapter.SelectCommand.Parameters.Add(parameter);
                        }
                    }
                    DataSet ds = new DataSet();
                    adapter.Fill(ds);
                    result = ds.Tables[0];
                }
            }

            return result;
        }
    }
}
